#include <websocketpp/config/asio_no_tls.hpp>  // 如果 WebSocket++ 正确安装，这应该可以工作
#include <websocketpp/server.hpp>
#include <iostream>

// 如果 asio_no_tls 不可用，使用 'websocketpp::config::asio' 替代
typedef websocketpp::server<websocketpp::config::asio> server;

// 消息处理函数
void on_message(server* s, websocketpp::connection_hdl hdl, server::message_ptr msg) {
    std::cout << "收到消息: " << msg->get_payload() << std::endl;
    
    try {
        s->send(hdl, msg->get_payload(), msg->get_opcode());
    } catch (const websocketpp::lib::error_code& e) {
        std::cout << "回显失败，原因: " << e 
                  << " (" << e.message() << ")" << std::endl;
    }
}

// 连接打开处理函数
void on_open(server* s, websocketpp::connection_hdl hdl) {
    std::cout << "连接已打开" << std::endl;
}

// 连接关闭处理函数
void on_close(server* s, websocketpp::connection_hdl hdl) {
    std::cout << "连接已关闭" << std::endl;
}

int main() {
    server ws_server;
    
    ws_server.set_access_channels(websocketpp::log::alevel::all);
    ws_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
    
    using websocketpp::lib::placeholders::_1;
    using websocketpp::lib::placeholders::_2;
    using websocketpp::lib::bind;

    ws_server.set_open_handler(bind(&on_open, &ws_server, _1));
    ws_server.set_close_handler(bind(&on_close, &ws_server, _1));
    ws_server.set_message_handler(bind(&on_message, &ws_server, _1, _2));
    
    ws_server.init_asio();
    ws_server.listen(9002);
    ws_server.start_accept();
    
    std::cout << "服务器在端口 9002 上启动" << std::endl;
    ws_server.run();
    
    return 0;
}